package domein;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.GregorianCalendar;
import java.util.List;
import persistentie.PersistentieController;

public class DomeinController
{
/*Attributen*/
	private Gebruiker huidigeGebruiker;
	private Gebruikers gebruikers;
	private Auto huidigeAuto;
	private Autos autos;
	private Klant huidigeKlant;
	private Klanten klanten;
	private GregorianCalendar beginDatum;
	private GregorianCalendar eindDatum;
	private GregorianCalendar huidigeDatum;
	private Huurovereenkomst huidigeHuurovereenkomst;

/*Constructor*/
	public DomeinController()
	{
		huidigeDatum=new GregorianCalendar();
	}

/*Methodes*/
	/*Maak huurovereenkomst*/
	public String maakLijstBeschikbareWagens()
	{
		/*nog uit te werken >datum,....*/	
		String output="";
		int a=1;
		
		this.ophalenAlleWagens();
		for(Auto eenAuto: autos.getAutos())
		{
			output+= a + ") " +  eenAuto.getAutoMerk() + " " + eenAuto.getAutoType();
			output+= "(" + eenAuto.getAutoCategorie()+ ")" + "\n";
			a++;
		}
		return output;
	}
	public String selecteerHuurwagen(int keuze)
	{		
		this.huidigeAuto = autos.geefAuto(keuze);
		return this.geefHuidigeWagenDetails();
	}
	public String maakLijstKlanten()
	{
		String output="";
		int a=1;
		
		this.ophalenKlanten();
		for(Klant eenKlant: klanten.getKlanten())
		{
			output+= a + ") " +  eenKlant.getKlantAchternaam() + " " + eenKlant.getKlantVoornaam();
			output+="\n";
			a++;
		}
		return output;
	}
	public String selecteerKlant(int keuze)
	{
		this.huidigeKlant = klanten.geefKlant(keuze);
		return this.geefHuidigeKlantDetails();
	}
	public void registreerHuurovereenkomst()
	{
		Huurovereenkomst huidigeHuurovereenkomst = 
			new Huurovereenkomst(this.huidigeKlant, this.huidigeAuto,this.beginDatum,this.eindDatum);
	}
	
	/*Beheer Huurwagens*/
	public void geefLijstWagens()
	{
		//this.ophalenAlleWagens();
	}
	public String geefHuidigeWagenDetails()
	{
		String output=huidigeAuto.getAutoMerk() + " " + huidigeAuto.getAutoType();
		output=String.format("%S\n",output);//zet de autonaam in Hoofdletters
		output+="Categorie: " + huidigeAuto.getAutoCategorie() + "\n";
		output+="Afhaalplaats: " + huidigeAuto.getAfhaalplaats() + "\n";
		output+="Bouwjaar: " + huidigeAuto.getBouwjaar() + "\n";
		output+="Kmstand: " + huidigeAuto.getKmStand() + "\n";
		output+="Nummerplaat: " + huidigeAuto.getKenteken() + "\n";
		output+="Chassisnummer: " + huidigeAuto.getChassisnummer() + "\n";
		output+="Transmissie: " + huidigeAuto.isTransmissie() + "\n";
		output+="Brandstof: " + huidigeAuto.getBrandstof() + "\n";
		output+="Aantal deuren: " + huidigeAuto.getAantalDeuren() + "\n";
		output+="Airco: " + huidigeAuto.getAirco() + "\n";
		output+="Aantal zitplaatsen: " + huidigeAuto.getAantalZitplaatsen() + "\n";
		output+="Aantal stuks bagage: " + huidigeAuto.getAantalStuksBagage() + "\n";
		output+="Standaard dagprijs: " + huidigeAuto.getDagprijs() + "\n";
		output+="Waarborgcode: " + huidigeAuto.getWaarborgcode() + "\n";
		output+="Gemiddeld verbruik: " + huidigeAuto.getVerbruik() + "\n";
		return output;
	}
	public void maakWagen()
	{
		
	}
	public void wijzigWagen()
	{
		
	}
	public void schrapWagen()
	{
		
	}
	
	/*Beheer Klanten*/
	public void geefLijstKlanten()
	{
		
	}
	public String geefHuidigeKlantDetails()
	{
		String output="Familienaam: " + huidigeKlant.getKlantAchternaam() + "\n";
		output+="Voornaam: " + huidigeKlant.getKlantVoornaam() + "\n";
		output+="Straat + huisnr: " + huidigeKlant.getAdres() + "\n";
		output+="Woonplaats: " + huidigeKlant.getPlaats() + "\n";
		output+="Postcode: " + huidigeKlant.getPostcode() + "\n";
		output+="Geboortedatum: " + huidigeKlant.getGeboortedatum() + "\n";
		output+="Geslacht: " + huidigeKlant.isGeslacht() + "\n";
		output+="Rijbewijs: " +huidigeKlant.getRijbewijs() + "\n";
		return output;
	}
	public void maakKlant()
	{
		
	}
	public void wijzigKlant()
	{
		
	}
	public void schrapKlant()
	{
		
	}

	/*Beheer Medewerkers*/
	public void geefLijstMedewerkers()
	{
		
	}
	public void geefMedewerkerDetails()
	{
		
	}
	public void maakMedewerker()
	{
		
	}
	public void wijzigMedewerker()
	{
		
	}
	public void schrapMedewerker()
	{
		
	}
	

	public List<String> maakLijstGebruikers()
	{
		if(this.klanten == null)
			this.ophalenGebruikers();
		
		List<String> details = gebruikers.geefDetails();
		return details;
	}
	public void voegKlantToe(String klantVoornaam, String klantAchternaam, String adres,int postcode, String plaats,boolean geslacht, int geboortedatum, String rijbewijs)
	{
		Klant klant = new Klant(klantVoornaam,klantAchternaam,adres,postcode,plaats,geslacht,geboortedatum,rijbewijs);
		this.klanten.voegKlantToe(klant);
		PersistentieController.getInstance().voegKlantToe(klantVoornaam,klantAchternaam,adres,postcode,plaats,geslacht,geboortedatum,rijbewijs);
	}
	
	/*Attributen opvullen uit de database*/
	public void ophalenAlleWagens()
	{
		this.autos = new Autos(PersistentieController.getInstance().getAutoLijst());
	}
	public void ophalenBeschikbareWagens(String periode)
	{
		this.autos = new Autos(PersistentieController.getInstance().getAutoLijst(periode));
	}
	public void ophalenKlanten()
	{
		this.klanten = new Klanten(PersistentieController.getInstance().getKlantenLijst());
	}
	public void ophalenGebruikers()
	{
		this.gebruikers = new Gebruikers(PersistentieController.getInstance().getGebruikersLijst());
	}
		
	/*MD5-hash voor het paswoord*/
	public String md5(String s)
	{
		MessageDigest m;
		try
		{
			String nul="";
			m = MessageDigest.getInstance("MD5");
			m.update(s.getBytes(), 0, s.length());
			String output = "" + new BigInteger(1, m.digest()).toString(16);
			for(int i=32 - output.length();i>0;i--)
				nul+="0";
			output = nul + output;
			return output;
		} catch (NoSuchAlgorithmException e)
		{
			e.printStackTrace();
		}
		return "";
	}
	
	/*Login*/
	public String loginGebruiker(String naam, String wachtwoord)
	{
		if(this.gebruikers == null)
			this.ophalenGebruikers();
		
		int i = gebruikers.checkGebruikersnaam(naam);
		if(i>=0)
		{
			if(gebruikers.checkGebruikerspaswoord(wachtwoord,i))
			{
				this.huidigeGebruiker = gebruikers.geefGebruiker(i);
				return "ok";
			}
			else
			{
				return "Gebruikersnaam en wachtwoord komen niet overeen!";
			}
		}
		else
		{
			System.out.println(naam + " " + wachtwoord);
			return "Deze inlognaam is niet gekend!";
		}			
	}

/*Getters & setters*/
	public Gebruiker getHuidigeGebruiker()
	{
		return this.huidigeGebruiker;
	}
	public void setBeginDatum(GregorianCalendar beginDatum)
	{
		this.beginDatum = beginDatum;
	}
	public void setEindDatum(GregorianCalendar eindDatum)
	{
		this.eindDatum = eindDatum;
	}

	public GregorianCalendar getHuidigeDatum()
	{
		return huidigeDatum;
	}

	public void setHuidigeDatum(GregorianCalendar huidigeDatum)
	{
		this.huidigeDatum = huidigeDatum;
	}

	public Auto getHuidigeAuto()
	{
		return huidigeAuto;
	}

	public Autos getAutos()
	{
		return autos;
	}

	public void setAutos(Autos autos)
	{
		this.autos = autos;
	}

	public Gebruikers getGebruikers()
	{
		return gebruikers;
	}

	public void setGebruikers(Gebruikers gebruikers)
	{
		this.gebruikers = gebruikers;
	}

	public Huurovereenkomst getHuidigeHuurovereenkomst()
	{
		return huidigeHuurovereenkomst;
	}

	public void setHuidigeHuurovereenkomst(Huurovereenkomst huidigeHuurovereenkomst)
	{
		this.huidigeHuurovereenkomst = huidigeHuurovereenkomst;
	}

	public Klant getHuidigeKlant()
	{
		return huidigeKlant;
	}

	public void setHuidigeKlant(Klant huidigeKlant)
	{
		this.huidigeKlant = huidigeKlant;
	}

	public Klanten getKlanten()
	{
		return klanten;
	}

	public void setKlanten(Klanten klanten)
	{
		this.klanten = klanten;
	}

	public GregorianCalendar getBeginDatum()
	{
		return beginDatum;
	}

	public GregorianCalendar getEindDatum()
	{
		return eindDatum;
	}

	public void setHuidigeAuto(Auto huidigeAuto)
	{
		this.huidigeAuto = huidigeAuto;
	}

	public void setHuidigeGebruiker(Gebruiker huidigeGebruiker)
	{
		this.huidigeGebruiker = huidigeGebruiker;
	}
}
